<!DOCTYPE HTML>
<html>
<!--
https://bugzilla.mozilla.org/show_bug.cgi?id=636627
-->
<head>
  <title>Test for Bug 636627</title>
  <script type="application/javascript" src="/MochiKit/packed.js"></script>
  <script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
  <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
</head>
<body>
<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=636627">Mozilla Bug 636627</a>
<p id="display"></p>
<pre id="test">
<script type="application/javascript">

/** Test for Bug 636627 **/

/**
 * This test is testing stepDown() and stepUp().
 */

function checkPresence()
{
  var input = document.createElement('input');
  is('stepDown' in input, true, 'stepDown() should be an input function');
  is('stepUp' in input, true, 'stepUp() should be an input function');
}

function checkAvailability()
{
  var testData =
  [
    ["text", false],
    ["password", false],
    ["search", false],
    ["telephone", false],
    ["email", false],
    ["url", false],
    ["hidden", false],
    ["checkbox", false],
    ["radio", false],
    ["file", false],
    ["submit", false],
    ["image", false],
    ["reset", false],
    ["button", false],
    ["number", true],
    ["range", true],
    ["date", true],
    ["time", true],
    ["month", true],
    ["week", true],
    ["datetime-local", true],
    ["color", false],
  ];

  var element = document.createElement("input");
  element.setAttribute('value', '0');

  for (data of testData) {
    var exceptionCaught = false;
    element.type = data[0];
    try {
      element.stepDown();
    } catch (e) {
      exceptionCaught = true;
    }
    is(exceptionCaught, !data[1], "stepDown() availability is not correct");

    exceptionCaught = false;
    try {
      element.stepUp();
    } catch (e) {
      exceptionCaught = true;
    }
    is(exceptionCaught, !data[1], "stepUp() availability is not correct");
  }
}

function checkStepDown()
{
  // This testData is very similar to the one in checkStepUp with some changes
  // relative to stepDown.
  var testData = [
  /* Initial value | step | min | max | stepDown arg | final value | exception */
  { type: 'number', data: [
    // Regular case.
    [ '1',   null,  null,  null,  null, '0',    false ],
    // Argument testing.
    [ '1',   null,  null,  null,  1,    '0',    false ],
    [ '9',   null,  null,  null,  9,    '0',    false ],
    [ '1',   null,  null,  null,  -1,   '2',    false ],
    [ '1',   null,  null,  null,  0,    '1',    false ],
    // Float values are rounded to integer (1.1 -> 1).
    [ '1',   null,  null,  null,  1.1,  '0',    false ],
    // With step values.
    [ '1',  '0.5',  null,  null,  null, '0.5',  false ],
    [ '1',  '0.25', null,  null,  4,    '0',    false ],
    // step = 0 isn't allowed (-> step = 1).
    [ '1',  '0',    null,  null,  null, '0',    false ],
    // step < 0 isn't allowed (-> step = 1).
    [ '1',  '-1',   null,  null,  null, '0',    false ],
    // step = NaN isn't allowed (-> step = 1).
    [ '1',  'foo',  null,  null,  null, '0',    false ],
    // Min values testing.
    [ '1',  '1',    'foo', null,  null, '0',    false ],
    [ '1',  null,   '-10', null,  null, '0',    false ],
    [ '1',  null,   '0',   null,  null, '0',    false ],
    [ '1',  null,   '10',  null,  null, '1',    false ],
    [ '1',  null,   '2',   null,  null, '1',    false ],
    [ '1',  null,   '1',   null,  null, '1',    false ],
    // Max values testing.
    [ '1',  '1',    null,  'foo', null, '0',    false ],
    [ '1',  null,   null,  '10',  null, '0',    false ],
    [ '1',  null,   null,  '0',   null, '0',    false ],
    [ '1',  null,   null,  '-10', null, '-10',  false ],
    [ '1',  null,   null,  '1',   null, '0',    false ],
    [ '5',  null,   null,  '3',   '3',  '2',    false ],
    [ '5',  '2',    '-6',  '3',   '2',  '2',    false ],
    [ '-3', '5',    '-10', '-3',  null, '-5',   false ],
    // Step mismatch.
    [ '1',  '2',    '-2',  null,  null, '0',    false ],
    [ '3',  '2',    '-2',  null,  null, '2',    false ],
    [ '3',  '2',    '-2',  null,  '2',  '0',    false ],
    [ '3',  '2',    '-2',  null,  '-2', '6',    false ],
    [ '1',  '2',    '-6',  null,  null, '0',    false ],
    [ '1',  '2',    '-2',  null,  null, '0',    false ],
    [ '1',  '3',    '-6',  null,  null, '0',    false ],
    [ '2',  '3',    '-6',  null,  null, '0',    false ],
    [ '2',  '3',    '1',   null,  null, '1',    false ],
    [ '5',  '3',    '1',   null,  null, '4',    false ],
    [ '3',  '2',    '-6',  null,  null, '2',    false ],
    [ '5',  '2',    '-6',  null,  null, '4',    false ],
    [ '6',  '2',   '1',    null,  null, '5',    false ],
    [ '8',  '3',   '1',    null,  null, '7',    false ],
    [ '9',  '2',   '-10',  null,  null, '8',    false ],
    [ '7',  '3',   '-10',  null,  null, '5',    false ],
    [ '-2', '3',   '-10',  null,  null, '-4',   false ],
    // Clamping.
    [ '0',  '2',    '-1',  null,  null, '-1',   false ],
    [ '10', '2',    '0',   '4',   '10', '0',    false ],
    [ '10', '2',    '0',   '4',   '5',  '0',    false ],
    // value = "" (NaN).
    [ '',   null,   null,  null,  null, '-1',   false ],
    [ '',    '2',   null,  null,  null, '-2',   false ],
    [ '',    '2',    '3',  null,  null,  '3',   false ],
    [ '',   null,    '3',  null,  null,  '3',   false ],
    [ '',    '2',    '3',   '8',  null,  '3',   false ],
    [ '',   null,  '-10',  '10',  null, '-1',   false ],
    [ '',    '3',  '-10',  '10',  null, '-1',   false ],
    // With step = 'any'.
    [ '0',  'any',  null,  null,  1,    null,   true ],
    [ '0',  'ANY',  null,  null,  1,    null,   true ],
    [ '0',  'AnY',  null,  null,  1,    null,   true ],
    [ '0',  'aNy',  null,  null,  1,    null,   true ],
    // With @value = step base.
    [ '1',  '2',    null,  null,  null, '-1',   false ],
  ]},
  { type: 'range', data: [
    // Regular case.
    [ '1',   null,  null,  null,  null, '0',    false ],
    // Argument testing.
    [ '1',   null,  null,  null,  1,    '0',    false ],
    [ '9',   null,  null,  null,  9,    '0',    false ],
    [ '1',   null,  null,  null,  -1,   '2',    false ],
    [ '1',   null,  null,  null,  0,    '1',    false ],
    // Float values are rounded to integer (1.1 -> 1).
    [ '1',   null,  null,  null,  1.1,  '0',    false ],
    // With step values.
    [ '1',  '0.5',  null,  null,  null, '0.5',  false ],
    [ '1',  '0.25', null,  null,  4,    '0',    false ],
    // step = 0 isn't allowed (-> step = 1).
    [ '1',  '0',    null,  null,  null, '0',    false ],
    // step < 0 isn't allowed (-> step = 1).
    [ '1',  '-1',   null,  null,  null, '0',    false ],
    // step = NaN isn't allowed (-> step = 1).
    [ '1',  'foo',  null,  null,  null, '0',    false ],
    // Min values testing.
    [ '1',  '1',    'foo', null,  null, '0',    false ],
    [ '1',  null,   '-10', null,  null, '0',    false ],
    [ '1',  null,   '0',   null,  null, '0',    false ],
    [ '1',  null,   '10',  null,  null, '10',   false ],
    [ '1',  null,   '2',   null,  null, '2',    false ],
    [ '1',  null,   '1',   null,  null, '1',    false ],
    // Max values testing.
    [ '1',  '1',    null,  'foo', null, '0',    false ],
    [ '1',  null,   null,  '10',  null, '0',    false ],
    [ '1',  null,   null,  '0',   null, '0',    false ],
    [ '1',  null,   null,  '-10', null, '0',    false ],
    [ '1',  null,   null,  '1',   null, '0',    false ],
    [ '5',  null,   null,  '3',   '3',  '0',    false ],
    [ '5',  '2',    '-6',  '3',   '2',  '-2',   false ],
    [ '-3', '5',    '-10', '-3',  null, '-10',  false ],
    // Step mismatch.
    [ '1',  '2',    '-2',  null,  null, '0',    false ],
    [ '3',  '2',    '-2',  null,  null, '2',    false ],
    [ '3',  '2',    '-2',  null,  '2',  '0',    false ],
    [ '3',  '2',    '-2',  null,  '-2', '8',    false ],
    [ '1',  '2',    '-6',  null,  null, '0',    false ],
    [ '1',  '2',    '-2',  null,  null, '0',    false ],
    [ '1',  '3',    '-6',  null,  null, '-3',   false ],
    [ '2',  '3',    '-6',  null,  null, '0',    false ],
    [ '2',  '3',    '1',   null,  null, '1',    false ],
    [ '5',  '3',    '1',   null,  null, '1',    false ],
    [ '3',  '2',    '-6',  null,  null, '2',    false ],
    [ '5',  '2',    '-6',  null,  null, '4',    false ],
    [ '6',  '2',   '1',    null,  null, '5',    false ],
    [ '8',  '3',   '1',    null,  null, '4',    false ],
    [ '9',  '2',   '-10',  null,  null, '8',    false ],
    [ '7',  '3',   '-10',  null,  null, '5',    false ],
    [ '-2', '3',   '-10',  null,  null, '-4',   false ],
    // Clamping.
    [ '0',  '2',    '-1',  null,  null, '-1',   false ],
    [ '10', '2',    '0',   '4',   '10', '0',    false ],
    [ '10', '2',    '0',   '4',   '5',  '0',    false ],
    // value = "" (default will be 50).
    [ '',   null,   null,  null,  null, '49',   false ],
    // With step = 'any'.
    [ '0',  'any',  null,  null,  1,    null,   true ],
    [ '0',  'ANY',  null,  null,  1,    null,   true ],
    [ '0',  'AnY',  null,  null,  1,    null,   true ],
    [ '0',  'aNy',  null,  null,  1,    null,   true ],
    // With @value = step base.
    [ '1',  '2',    null,  null,  null, '1',    false ],
  ]},
  { type: 'date', data: [
    // Regular case.
    [ '2012-07-09',  null,  null,  null,  null, '2012-07-08',   false ],
    // Argument testing.
    [ '2012-07-09',  null,  null,  null,  1,    '2012-07-08',   false ],
    [ '2012-07-09',  null,  null,  null,  5,    '2012-07-04',   false ],
    [ '2012-07-09',  null,  null,  null,  -1,   '2012-07-10',   false ],
    [ '2012-07-09',  null,  null,  null,  0,    '2012-07-09',   false ],
    // Month/Year wrapping.
    [ '2012-08-01',  null,  null,  null,  1,    '2012-07-31',   false ],
    [ '1969-01-02',  null,  null,  null,  4,    '1968-12-29',   false ],
    [ '1969-01-01',  null,  null,  null,  -365, '1970-01-01',   false ],
    [ '2012-02-29',  null,  null,  null,  -1,   '2012-03-01',   false ],
    // Float values are rounded to integer (1.1 -> 1).
    [ '2012-01-02',  null,  null,  null,  1.1,  '2012-01-01',   false ],
    [ '2012-01-02',  null,  null,  null,  1.9,  '2012-01-01',   false ],
    // With step values.
    [ '2012-01-03',  '0.5', null,  null,  null, '2012-01-02',   false ],
    [ '2012-01-02',  '0.5', null,  null,  null, '2012-01-01',   false ],
    [ '2012-01-01',  '2',   null,  null,  null, '2011-12-30',   false ],
    [ '2012-01-02',  '0.25',null,  null,  4,    '2011-12-29',   false ],
    [ '2012-01-15',  '1.1',  '2012-01-01', null,  1,    '2012-01-14',   false ],
    [ '2012-01-12',  '1.1',  '2012-01-01', null,  2,    '2012-01-10',   false ],
    [ '2012-01-23',  '1.1',  '2012-01-01', null,  10,   '2012-01-13',   false ],
    [ '2012-01-23',  '1.1',  '2012-01-01', null,  11,   '2012-01-12',   false ],
    [ '1968-01-12',  '1.1',  '1968-01-01', null,  8,    '1968-01-04',   false ],
    // step = 0 isn't allowed (-> step = 1).
    [ '2012-01-02',  '0',   null,  null,  null, '2012-01-01',   false ],
    // step < 0 isn't allowed (-> step = 1).
    [ '2012-01-02',  '-1',  null,  null,  null, '2012-01-01',   false ],
    // step = NaN isn't allowed (-> step = 1).
    [ '2012-01-02',  'foo', null,  null,  null, '2012-01-01',   false ],
    // Min values testing.
    [ '2012-01-03',  '1',    'foo',        null,  2,     '2012-01-01',  false ],
    [ '2012-01-02',  '1',    '2012-01-01', null,  null,  '2012-01-01',  false ],
    [ '2012-01-01',  '1',    '2012-01-01', null,  null,  '2012-01-01',  false ],
    [ '2012-01-01',  '1',    '2012-01-10', null,  1,     '2012-01-01',  false ],
    [ '2012-01-05',  '3',    '2012-01-01', null,  null,  '2012-01-04',  false ],
    [ '1969-01-01',  '5',    '1969-01-01', '1969-01-02', null,  '1969-01-01',  false ],
    // Max values testing.
    [ '2012-01-02',  '1',    null,  'foo',         null,  '2012-01-01',  false ],
    [ '2012-01-02',  null,   null,  '2012-01-05',  null,  '2012-01-01',  false ],
    [ '2012-01-03',  null,   null,  '2012-01-03',  null,  '2012-01-02',  false ],
    [ '2012-01-07',  null,   null,  '2012-01-04',  4,     '2012-01-03',  false ],
    [ '2012-01-07',  '2',    null,  '2012-01-04',  3,     '2012-01-01',  false ],
    // Step mismatch.
    [ '2012-01-04',  '2',    '2012-01-01',  null,         null,  '2012-01-03',  false ],
    [ '2012-01-06',  '2',    '2012-01-01',  null,         2,     '2012-01-03',  false ],
    [ '2012-01-05',  '2',    '2012-01-04',  '2012-01-08', null,  '2012-01-04',  false ],
    [ '1970-01-04',  '2',    null,          null,         null,  '1970-01-02',  false ],
    [ '1970-01-09',  '3',    null,          null,         null,  '1970-01-06',  false ],
    // Clamping.
    [ '2012-05-01',  null,   null,          '2012-01-05', null,  '2012-01-05',  false ],
    [ '1970-01-05',  '2',    '1970-01-02',  '1970-01-05', null,  '1970-01-04',  false ],
    [ '1970-01-01',  '5',    '1970-01-02',  '1970-01-09', 10,    '1970-01-01',  false ],
    [ '1970-01-07',  '5',    '1969-12-27',  '1970-01-06', 2,     '1970-01-01',  false ],
    [ '1970-03-08',  '3',    '1970-02-01',  '1970-02-07', 15,    '1970-02-01',  false ],
    [ '1970-01-10',  '3',    '1970-01-01',  '1970-01-06', 2,     '1970-01-04',  false ],
    // value = "" (NaN).
    [ '',   null,   null,  null,  null, '1969-12-31',    false ],
    // With step = 'any'.
    [ '2012-01-01',  'any',  null,  null,  1,  null,  true ],
    [ '2012-01-01',  'ANY',  null,  null,  1,  null,  true ],
    [ '2012-01-01',  'AnY',  null,  null,  1,  null,  true ],
    [ '2012-01-01',  'aNy',  null,  null,  1,  null,  true ],
  ]},
  { type: 'time', data: [
    // Regular case.
    [ '16:39',  null,  null,  null,  null, '16:38',   false ],
    // Argument testing.
    [ '16:40',  null,  null,  null,  1,    '16:39',   false ],
    [ '16:40',  null,  null,  null,  5,    '16:35',   false ],
    [ '16:40',  null,  null,  null,  -1,    '16:41',   false ],
    [ '16:40',  null,  null,  null,  0,    '16:40',   false ],
    // hour/minutes/seconds wrapping.
    [ '05:00',  null,  null,  null, null,   '04:59',   false ],
    [ '05:00:00', 1,   null,  null, null,   '04:59:59',   false ],
    [ '05:00:00', 0.1, null,  null, null,   '04:59:59.900',   false ],
    [ '05:00:00', 0.01, null, null, null,   '04:59:59.990',   false ],
    [ '05:00:00', 0.001, null, null, null,  '04:59:59.999',   false ],
    // stepDown() on '00:00' gives '23:59'.
    [ '00:00',  null,  null,  null,  1,    '23:59',   false ],
    [ '00:00',  null,  null,  null,  3,    '23:57',   false ],
    // Some random step values..
    [ '16:56',  '0.5', null,  null,  null, '16:55:59.500',   false ],
    [ '16:56',  '2',   null,  null,  null, '16:55:58',   false ],
    [ '16:56',  '0.25',null,  null,  4,    '16:55:59',   false ],
    [ '16:57',  '1.1',  '16:00', null,  1,    '16:56:59.900',   false ],
    [ '16:57',  '1.1',  '16:00', null,  2,    '16:56:58.800',   false ],
    [ '16:57',  '1.1',  '16:00', null,  10,   '16:56:50',   false ],
    [ '16:57',  '1.1',  '16:00', null,  11,   '16:56:48.900',   false ],
    [ '16:57',  '1.1',  '16:00', null,  8,    '16:56:52.200',   false ],
    // Invalid @step, means that we use the default value.
    [ '17:01',  '0',   null,  null,  null, '17:00',   false ],
    [ '17:01',  '-1',  null,  null,  null, '17:00',   false ],
    [ '17:01',  'foo', null,  null,  null, '17:00',   false ],
    // Min values testing.
    [ '17:02',  '60',    'foo',        null,  2,     '17:00',  false ],
    [ '17:10',  '60',    '17:09', null,  null,  '17:09',  false ],
    [ '17:10',  '60',    '17:10', null,  null,  '17:10',  false ],
    [ '17:10',  '60',    '17:30', null,  1,     '17:10',  false ],
    [ '17:10',  '180',    '17:05', null,  null,  '17:08',  false ],
    [ '17:10',  '300',    '17:10', '17:11', null,  '17:10',  false ],
    // Max values testing.
    [ '17:15',  '60',   null,  'foo',    null,  '17:14',  false ],
    [ '17:15',  null,   null,  '17:20',  null,  '17:14',  false ],
    [ '17:15',  null,   null,  '17:15',  null,  '17:14',  false ],
    [ '17:15',  null,   null,  '17:13',  4,     '17:11',  false ],
    [ '17:15',  '120',  null,  '17:13',  3,     '17:09',  false ],
    // Step mismatch.
    [ '17:19',  '120',  '17:10',  null,    null,  '17:18',  false ],
    [ '17:19',  '120',  '17:10',  null,    2,     '17:16',  false ],
    [ '17:19',  '120',  '17:18',  '17:25', null,  '17:18',  false ],
    [ '17:19',  '120',  null,     null,    null,  '17:17',  false ],
    [ '17:19',  '180',  null,     null,    null,  '17:16',  false ],
    // Clamping.
    [ '17:22',  null,   null,     '17:11', null,  '17:11',  false ],
    [ '17:22',  '120',  '17:20',  '17:22', null,  '17:20',  false ],
    [ '17:22',  '300',  '17:12',  '17:20', 10,    '17:12',  false ],
    [ '17:22',  '300',  '17:18',  '17:20', 2,     '17:18',  false ],
    [ '17:22',  '180',  '17:00',  '17:20', 15,    '17:00',  false ],
    [ '17:22',  '180',  '17:10',  '17:20', 2,     '17:16',  false ],
    // value = "" (NaN).
    [ '',   null,   null,  null,  null, '23:59',    false ],
    // With step = 'any'.
    [ '17:26',  'any',  null,  null,  1,  null,  true ],
    [ '17:26',  'ANY',  null,  null,  1,  null,  true ],
    [ '17:26',  'AnY',  null,  null,  1,  null,  true ],
    [ '17:26',  'aNy',  null,  null,  1,  null,  true ],
  ]},
  { type: 'month', data: [
    // Regular case.
    [ '2016-08',  null,  null,  null,  null, '2016-07',   false ],
    // Argument testing.
    [ '2016-08',  null,  null,  null,  1,    '2016-07',   false ],
    [ '2016-08',  null,  null,  null,  5,    '2016-03',   false ],
    [ '2016-08',  null,  null,  null,  -1,   '2016-09',   false ],
    [ '2016-08',  null,  null,  null,  0,    '2016-08',   false ],
    // Month/Year wrapping.
    [ '2016-01',  null,  null,  null,  1,    '2015-12',   false ],
    [ '1969-02',  null,  null,  null,  4,    '1968-10',   false ],
    [ '1969-01',  null,  null,  null,  -12,  '1970-01',   false ],
    // Float values are rounded to integer (1.1 -> 1).
    [ '2016-08',  null,  null,  null,  1.1,  '2016-07',   false ],
    [ '2016-01',  null,  null,  null,  1.9,  '2015-12',   false ],
    // With step values.
    [ '2016-03',  '0.5', null,  null,  null,      '2016-02',   false ],
    [ '2016-03',  '2',   null,  null,  null,      '2016-01',   false ],
    [ '2016-03',  '0.25',null,  null,  4,         '2015-11',   false ],
    [ '2016-12',  '1.1',  '2016-01', null,  1,    '2016-11',   false ],
    [ '2016-12',  '1.1',  '2016-01', null,  2,    '2016-10',   false ],
    [ '2016-12',  '1.1',  '2016-01', null,  10,   '2016-02',   false ],
    [ '2016-12',  '1.1',  '2016-01', null,  12,   '2016-01',   false ],
    [ '1968-12',  '1.1',  '1968-01', null,  8,    '1968-04',   false ],
    // step = 0 isn't allowed (-> step = 1).
    [ '2016-02',  '0',   null,  null,  null, '2016-01',   false ],
    // step < 0 isn't allowed (-> step = 1).
    [ '2016-02',  '-1',  null,  null,  null, '2016-01',   false ],
    // step = NaN isn't allowed (-> step = 1).
    [ '2016-02',  'foo', null,  null,  null, '2016-01',   false ],
    // Min values testing.
    [ '2016-03',  '1',    'foo',     null,      2,     '2016-01',  false ],
    [ '2016-02',  '1',    '2016-01', null,      null,  '2016-01',  false ],
    [ '2016-01',  '1',    '2016-01', null,      null,  '2016-01',  false ],
    [ '2016-01',  '1',    '2016-01', null,      1,     '2016-01',  false ],
    [ '2016-05',  '3',    '2016-01', null,      null,  '2016-04',  false ],
    [ '1969-01',  '5',    '1969-01', '1969-02', null,  '1969-01',  false ],
    // Max values testing.
    [ '2016-02',  '1',    null,  'foo',      null,  '2016-01',  false ],
    [ '2016-02',  null,   null,  '2016-05',  null,  '2016-01',  false ],
    [ '2016-03',  null,   null,  '2016-03',  null,  '2016-02',  false ],
    [ '2016-07',  null,   null,  '2016-04',  4,     '2016-03',  false ],
    [ '2016-07',  '2',    null,  '2016-04',  3,     '2016-01',  false ],
    // Step mismatch.
    [ '2016-04',  '2',    '2016-01',  null,         null,  '2016-03',  false ],
    [ '2016-06',  '2',    '2016-01',  null,         2,     '2016-03',  false ],
    [ '2016-05',  '2',    '2016-04',  '2016-08',    null,  '2016-04',  false ],
    [ '1970-04',  '2',    null,       null,         null,  '1970-02',  false ],
    [ '1970-09',  '3',    null,       null,         null,  '1970-06',  false ],
    // Clamping.
    [ '2016-05',  null,   null,       '2016-01',    null,  '2016-01',  false ],
    [ '1970-05',  '2',    '1970-02',  '1970-05',    null,  '1970-04',  false ],
    [ '1970-01',  '5',    '1970-02',  '1970-09',    10,    '1970-01',  false ],
    [ '1970-07',  '5',    '1969-12',  '1970-10',    2,     '1969-12',  false ],
    [ '1970-08',  '3',    '1970-01',  '1970-07',    15,    '1970-01',  false ],
    [ '1970-10',  '3',    '1970-01',  '1970-06',    2,     '1970-04',  false ],
    // value = "" (NaN).
    [ '',   null,   null,  null,  null, '1969-12',    false ],
    // With step = 'any'.
    [ '2016-01',  'any',  null,  null,  1,  null,  true ],
    [ '2016-01',  'ANY',  null,  null,  1,  null,  true ],
    [ '2016-01',  'AnY',  null,  null,  1,  null,  true ],
    [ '2016-01',  'aNy',  null,  null,  1,  null,  true ],
  ]},
  { type: 'week', data: [
    // Regular case.
    [ '2016-W40',  null,  null,  null,  null, '2016-W39',   false ],
    // Argument testing.
    [ '2016-W40',  null,  null,  null,  1,    '2016-W39',   false ],
    [ '2016-W40',  null,  null,  null,  5,    '2016-W35',   false ],
    [ '2016-W40',  null,  null,  null,  -1,   '2016-W41',   false ],
    [ '2016-W40',  null,  null,  null,  0,    '2016-W40',   false ],
    // Week/Year wrapping.
    [ '2016-W01',  null,  null,  null,  1,    '2015-W53',   false ],
    [ '1969-W02',  null,  null,  null,  4,    '1968-W50',   false ],
    [ '1969-W01',  null,  null,  null,  -52,  '1970-W01',   false ],
    // Float values are rounded to integer (1.1 -> 1).
    [ '2016-W40',  null,  null,  null,  1.1,  '2016-W39',   false ],
    [ '2016-W01',  null,  null,  null,  1.9,  '2015-W53',   false ],
    // With step values.
    [ '2016-W03',  '0.5',  null,       null,  null, '2016-W02',   false ],
    [ '2016-W03',  '2',    null,       null,  null, '2016-W01',   false ],
    [ '2016-W03',  '0.25', null,       null,  4,    '2015-W52',   false ],
    [ '2016-W52',  '1.1',  '2016-W01', null,  1,    '2016-W51',   false ],
    [ '2016-W52',  '1.1',  '2016-W01', null,  2,    '2016-W50',   false ],
    [ '2016-W52',  '1.1',  '2016-W01', null,  10,   '2016-W42',   false ],
    [ '2016-W52',  '1.1',  '2016-W01', null,  52,   '2016-W01',   false ],
    [ '1968-W52',  '1.1',  '1968-W01', null,  8,    '1968-W44',   false ],
    // step = 0 isn't allowed (-> step = 1).
    [ '2016-W02',  '0',   null,  null,  null, '2016-W01',   false ],
    // step < 0 isn't allowed (-> step = 1).
    [ '2016-W02',  '-1',  null,  null,  null, '2016-W01',   false ],
    // step = NaN isn't allowed (-> step = 1).
    [ '2016-W02',  'foo', null,  null,  null, '2016-W01',   false ],
    // Min values testing.
    [ '2016-W03',  '1',    'foo',      null,       2,     '2016-W01',  false ],
    [ '2016-W02',  '1',    '2016-01',  null,       null,  '2016-W01',  false ],
    [ '2016-W01',  '1',    '2016-W01', null,       null,  '2016-W01',  false ],
    [ '2016-W01',  '1',    '2016-W01', null,       1,     '2016-W01',  false ],
    [ '2016-W05',  '3',    '2016-W01', null,       null,  '2016-W04',  false ],
    [ '1969-W01',  '5',    '1969-W01', '1969-W02', null,  '1969-W01',  false ],
    // Max values testing.
    [ '2016-W02',  '1',    null,  'foo',       null,  '2016-W01',  false ],
    [ '2016-W02',  null,   null,  '2016-W05',  null,  '2016-W01',  false ],
    [ '2016-W03',  null,   null,  '2016-W03',  null,  '2016-W02',  false ],
    [ '2016-W07',  null,   null,  '2016-W04',  4,     '2016-W03',  false ],
    [ '2016-W07',  '2',    null,  '2016-W04',  3,     '2016-W01',  false ],
    // Step mismatch.
    [ '2016-W04',  '2',    '2016-W01',  null,        null,  '2016-W03',  false ],
    [ '2016-W06',  '2',    '2016-W01',  null,        2,     '2016-W03',  false ],
    [ '2016-W05',  '2',    '2016-W04',  '2016-W08',  null,  '2016-W04',  false ],
    [ '1970-W04',  '2',    null,        null,        null,  '1970-W02',  false ],
    [ '1970-W09',  '3',    null,        null,        null,  '1970-W06',  false ],
    // Clamping.
    [ '2016-W05',  null,   null,        '2016-W01',  null,  '2016-W01',  false ],
    [ '1970-W05',  '2',    '1970-W02',  '1970-W05',  null,  '1970-W04',  false ],
    [ '1970-W01',  '5',    '1970-W02',  '1970-W09',  10,    '1970-W01',  false ],
    [ '1970-W07',  '5',    '1969-W52',  '1970-W10',  2,     '1969-W52',  false ],
    [ '1970-W08',  '3',    '1970-W01',  '1970-W07',  15,    '1970-W01',  false ],
    [ '1970-W10',  '3',    '1970-W01',  '1970-W06',  2,     '1970-W04',  false ],
    // value = "" (NaN).
    [ '',   null,   null,  null,  null, '1970-W01',    false ],
    // With step = 'any'.
    [ '2016-W01',  'any',  null,  null,  1,  null,  true ],
    [ '2016-W01',  'ANY',  null,  null,  1,  null,  true ],
    [ '2016-W01',  'AnY',  null,  null,  1,  null,  true ],
    [ '2016-W01',  'aNy',  null,  null,  1,  null,  true ],
  ]},
  { type: 'datetime-local', data: [
    // Regular case.
    [ '2017-02-07T09:30',  null,  null,  null,  null, '2017-02-07T09:29',   false ],
    // Argument testing.
    [ '2017-02-07T09:30',  null,  null,  null,  1,    '2017-02-07T09:29',   false ],
    [ '2017-02-07T09:30',  null,  null,  null,  5,    '2017-02-07T09:25',   false ],
    [ '2017-02-07T09:30',  null,  null,  null,  -1,   '2017-02-07T09:31',   false ],
    [ '2017-02-07T09:30',  null,  null,  null,  0,    '2017-02-07T09:30',   false ],
    // hour/minutes/seconds wrapping.
    [ '2000-01-01T05:00',    null,  null, null, null,  '2000-01-01T04:59',        false ],
    [ '2000-01-01T05:00:00', 1,     null, null, null,  '2000-01-01T04:59:59',     false ],
    [ '2000-01-01T05:00:00', 0.1,   null, null, null,  '2000-01-01T04:59:59.900', false ],
    [ '2000-01-01T05:00:00', 0.01,  null, null, null,  '2000-01-01T04:59:59.990', false ],
    [ '2000-01-01T05:00:00', 0.001, null, null, null,  '2000-01-01T04:59:59.999', false ],
    // month/year wrapping.
    [ '2012-08-01T12:00',  null,  null,  null,  1440,  '2012-07-31T12:00',   false ],
    [ '1969-01-02T12:00',  null,  null,  null,  5760,  '1968-12-29T12:00',   false ],
    [ '1969-12-31T00:00',  null,  null,  null,  -1440, '1970-01-01T00:00',   false ],
    [ '2012-02-29T00:00',  null,  null,  null,  -1440, '2012-03-01T00:00',   false ],
    // stepDown() on '00:00' gives '23:59'.
    [ '2017-02-07T00:00',  null,  null,  null,  1,    '2017-02-06T23:59',   false ],
    [ '2017-02-07T00:00',  null,  null,  null,  3,    '2017-02-06T23:57',   false ],
    // Some random step values..
    [ '2017-02-07T16:07',  '0.5',    null,               null,  null, '2017-02-07T16:06:59.500', false ],
    [ '2017-02-07T16:07',  '2',      null,               null,  null, '2017-02-07T16:06:58',     false ],
    [ '2017-02-07T16:07',  '0.25',   null,               null,  4,    '2017-02-07T16:06:59',     false ],
    [ '2017-02-07T16:07',  '1.1',    '2017-02-07T16:00', null,  1,    '2017-02-07T16:06:59.100', false ],
    [ '2017-02-07T16:07',  '1.1',    '2017-02-07T16:00', null,  2,    '2017-02-07T16:06:58',     false ],
    [ '2017-02-07T16:07',  '1.1',    '2017-02-07T16:00', null,  10,   '2017-02-07T16:06:49.200', false ],
    [ '2017-02-07T16:07',  '129600', '2017-02-01T00:00', null,  2,    '2017-02-05T12:00',        false ],
    // step = 0 isn't allowed (-> step = 1).
    [ '2017-02-07T10:15',  '0',   null,  null,  null, '2017-02-07T10:14',   false ],
    // step < 0 isn't allowed (-> step = 1).
    [ '2017-02-07T10:15',  '-1',  null,  null,  null, '2017-02-07T10:14',   false ],
    // step = NaN isn't allowed (-> step = 1).
    [ '2017-02-07T10:15',  'foo', null,  null,  null, '2017-02-07T10:14',   false ],
    // Min values testing.
    [ '2012-02-02T17:02',  '60',     'foo',              null,  2,     '2012-02-02T17:00',  false ],
    [ '2012-02-02T17:10',  '60',     '2012-02-02T17:09', null,  null,  '2012-02-02T17:09',  false ],
    [ '2012-02-02T17:10',  '60',     '2012-02-02T17:10', null,  null,  '2012-02-02T17:10',  false ],
    [ '2012-02-02T17:10',  '60',     '2012-02-02T17:30', null,  1,     '2012-02-02T17:10',  false ],
    [ '2012-02-02T17:10',  '180',    '2012-02-02T17:05', null,  null,  '2012-02-02T17:08',  false ],
    [ '2012-02-03T20:05',  '86400',  '2012-02-02T17:05', null,  null,  '2012-02-03T17:05',  false ],
    [ '2012-02-03T18:00',  '129600', '2012-02-01T00:00', null,  null,  '2012-02-02T12:00',  false ],
    // Max values testing.
    [ '2012-02-02T17:15',  '60',     null,  'foo',               null,  '2012-02-02T17:14',  false ],
    [ '2012-02-02T17:15',  null,     null,  '2012-02-02T17:20',  null,  '2012-02-02T17:14',  false ],
    [ '2012-02-02T17:15',  null,     null,  '2012-02-02T17:15',  null,  '2012-02-02T17:14',  false ],
    [ '2012-02-02T17:15',  null,     null,  '2012-02-02T17:13',  4,     '2012-02-02T17:11',  false ],
    [ '2012-02-02T17:15',  '120',    null,  '2012-02-02T17:13',  3,     '2012-02-02T17:09',  false ],
    [ '2012-02-03T20:05',  '86400',  null,  '2012-02-03T20:05',  null,  '2012-02-02T20:05',  false ],
    [ '2012-02-03T18:00',  '129600', null,  '2012-02-03T20:00',  null,  '2012-02-02T06:00',  false ],
    // Step mismatch.
    [ '2017-02-07T17:19',  '120',    '2017-02-07T17:10',  null,               null,  '2017-02-07T17:18',  false ],
    [ '2017-02-07T17:19',  '120',    '2017-02-07T17:10',  null,               2,     '2017-02-07T17:16',  false ],
    [ '2017-02-07T17:19',  '120',    '2017-02-07T17:18',  '2017-02-07T17:25', null,  '2017-02-07T17:18',  false ],
    [ '2017-02-07T17:19',  '120',    null,                null,               null,  '2017-02-07T17:17',  false ],
    [ '2017-02-07T17:19',  '180',    null,                null,               null,  '2017-02-07T17:16',  false ],
    [ '2017-02-07T17:19',  '172800', '2017-02-02T17:19', '2017-02-10T17:19',  null,  '2017-02-06T17:19',  false ],
    // Clamping.
    [ '2017-02-07T17:22',  null,   null,                '2017-02-07T17:11', null,  '2017-02-07T17:11',  false ],
    [ '2017-02-07T17:22',  '120',  '2017-02-07T17:20',  '2017-02-07T17:22', null,  '2017-02-07T17:20',  false ],
    [ '2017-02-07T17:22',  '300',  '2017-02-07T17:12',  '2017-02-07T17:20', 10,    '2017-02-07T17:12',  false ],
    [ '2017-02-07T17:22',  '300',  '2017-02-07T17:18',  '2017-02-07T17:20', 2,     '2017-02-07T17:18',  false ],
    [ '2017-02-07T17:22',  '600',  '2017-02-02T17:00',  '2017-02-07T17:00', 15,    '2017-02-07T15:00',  false ],
    [ '2017-02-07T17:22',  '600',  '2017-02-02T17:00',  '2017-02-07T17:00', 2,     '2017-02-07T17:00',  false ],
    // value = "" (NaN).
    [ '',   null,   null,  null,  null, '1969-12-31T23:59',    false ],
    // With step = 'any'.
    [ '2017-02-07T15:20',  'any',  null,  null,  1,  null,  true ],
    [ '2017-02-07T15:20',  'ANY',  null,  null,  1,  null,  true ],
    [ '2017-02-07T15:20',  'AnY',  null,  null,  1,  null,  true ],
    [ '2017-02-07T15:20',  'aNy',  null,  null,  1,  null,  true ],
  ]},
  ];

  for (var test of testData) {
    for (var data of test.data) {
      var element = document.createElement("input");
      element.type = test.type;

      if (data[1] != null) {
        element.step = data[1];
      }

      if (data[2] != null) {
        element.min = data[2];
      }

      if (data[3] != null) {
        element.max = data[3];
      }

      // Set 'value' last for type=range, because the final sanitized value
      // after setting 'step', 'min' and 'max' can be affected by the order in
      // which those attributes are set. Setting 'value' last makes it simpler
      // to reason about what the final value should be.
      if (data[0] != null) {
        element.setAttribute('value', data[0]);
      }

      var exceptionCaught = false;
      try {
        if (data[4] != null) {
          element.stepDown(data[4]);
        } else {
          element.stepDown();
        }

        is(element.value, data[5], "The value for type=" + test.type + " should be " + data[5]);
      } catch (e) {
        exceptionCaught = true;
        is(element.value, data[0], e.name + "The value should not have changed");
        is(e.name, 'InvalidStateError',
           "It should be a InvalidStateError exception.");
      } finally {
        is(exceptionCaught, data[6], "exception status should be " + data[6]);
      }
    }
  }
}

function checkStepUp()
{
  // This testData is very similar to the one in checkStepDown with some changes
  // relative to stepUp.
  var testData = [
  /* Initial value | step | min | max | stepUp arg | final value | exception */
  { type: 'number', data: [
    // Regular case.
    [ '1',   null,  null,  null,  null, '2',   false ],
    // Argument testing.
    [ '1',   null,  null,  null,  1,    '2',   false ],
    [ '9',   null,  null,  null,  9,    '18',  false ],
    [ '1',   null,  null,  null,  -1,   '0',   false ],
    [ '1',   null,  null,  null,  0,    '1',   false ],
    // Float values are rounded to integer (1.1 -> 1).
    [ '1',   null,  null,  null,  1.1,  '2',   false ],
    // With step values.
    [ '1',  '0.5',  null,  null,  null, '1.5', false ],
    [ '1',  '0.25', null,  null,  4,    '2',   false ],
    // step = 0 isn't allowed (-> step = 1).
    [ '1',  '0',    null,  null,  null, '2',   false ],
    // step < 0 isn't allowed (-> step = 1).
    [ '1',  '-1',   null,  null,  null, '2',   false ],
    // step = NaN isn't allowed (-> step = 1).
    [ '1',  'foo',  null,  null,  null, '2',   false ],
    // Min values testing.
    [ '1',  '1',    'foo', null,  null, '2',   false ],
    [ '1',  null,   '-10', null,  null, '2',   false ],
    [ '1',  null,   '0',   null,  null, '2',   false ],
    [ '1',  null,   '10',  null,  null, '10',  false ],
    [ '1',  null,   '2',   null,  null, '2',   false ],
    [ '1',  null,   '1',   null,  null, '2',   false ],
    [ '0',  null,   '4',   null,  '5',  '5',   false ],
    [ '0',  '2',    '5',   null,  '3',  '5',   false ],
    // Max values testing.
    [ '1',  '1',    null,  'foo', null, '2',   false ],
    [ '1',  null,   null,  '10',  null, '2',   false ],
    [ '1',  null,   null,  '0',   null, '1',   false ],
    [ '1',  null,   null,  '-10', null, '1',   false ],
    [ '1',  null,   null,  '1',   null, '1',   false ],
    [ '-3', '5',    '-10', '-3',  null, '-3',  false ],
    // Step mismatch.
    [ '1',  '2',    '0',   null,  null, '2',   false ],
    [ '1',  '2',    '0',   null,  '2',  '4',   false ],
    [ '8',  '2',    null,  '9',   null, '8',   false ],
    [ '-3', '2',    '-6',  null,  null, '-2',  false ],
    [ '9',  '3',    '-10', null,  null, '11',  false ],
    [ '7',  '3',    '-10', null,  null, '8',   false ],
    [ '7',  '3',    '5',   null,  null, '8',   false ],
    [ '9',  '4',    '3',   null,  null, '11',  false ],
    [ '-2', '3',    '-6',  null,  null, '0',   false ],
    [ '7',  '3',    '6',   null,  null, '9',   false ],
    // Clamping.
    [ '1',  '2',    '0',  '3',   null,  '2',   false ],
    [ '0',  '5',    '1',  '8',   '10',  '6',   false ],
    [ '-9', '3',    '-8', '-1',  '5',   '-2',  false ],
    [ '-9', '3',    '8',  '15',  '15',  '14',  false ],
    [ '-1', '3',    '-1', '4',   '3',   '2',   false ],
    [ '-3', '2',    '-6',  '-2',  null, '-2',  false ],
    [ '-3', '2',    '-6',  '-1',  null, '-2',  false ],
    // value = "" (NaN).
    [ '',   null,   null,  null,  null,  '1',  false ],
    [ '',   null,   null,  null,  null,  '1',  false ],
    [ '',    '2',   null,  null,  null,  '2',  false ],
    [ '',    '2',    '3',  null,  null,  '3',  false ],
    [ '',   null,    '3',  null,  null,  '3',  false ],
    [ '',    '2',    '3',   '8',  null,  '3',  false ],
    [ '',   null,  '-10',  '10',  null,  '1',  false ],
    [ '',    '3',  '-10',  '10',  null,  '2',  false ],
    // With step = 'any'.
    [ '0',  'any',  null,  null,  1,    null,  true ],
    [ '0',  'ANY',  null,  null,  1,    null,  true ],
    [ '0',  'AnY',  null,  null,  1,    null,  true ],
    [ '0',  'aNy',  null,  null,  1,    null,  true ],
    // With @value = step base.
    [ '1',  '2',    null,  null,  null, '3',   false ],
  ]},
  { type: 'range', data: [
    // Regular case.
    [ '1',   null,  null,  null,  null, '2',   false ],
    // Argument testing.
    [ '1',   null,  null,  null,  1,    '2',   false ],
    [ '9',   null,  null,  null,  9,    '18',  false ],
    [ '1',   null,  null,  null,  -1,   '0',   false ],
    [ '1',   null,  null,  null,  0,    '1',   false ],
    // Float values are rounded to integer (1.1 -> 1).
    [ '1',   null,  null,  null,  1.1,  '2',   false ],
    // With step values.
    [ '1',  '0.5',  null,  null,  null, '1.5', false ],
    [ '1',  '0.25', null,  null,  4,    '2',   false ],
    // step = 0 isn't allowed (-> step = 1).
    [ '1',  '0',    null,  null,  null, '2',   false ],
    // step < 0 isn't allowed (-> step = 1).
    [ '1',  '-1',   null,  null,  null, '2',   false ],
    // step = NaN isn't allowed (-> step = 1).
    [ '1',  'foo',  null,  null,  null, '2',   false ],
    // Min values testing.
    [ '1',  '1',    'foo', null,  null, '2',   false ],
    [ '1',  null,   '-10', null,  null, '2',   false ],
    [ '1',  null,   '0',   null,  null, '2',   false ],
    [ '1',  null,   '10',  null,  null, '11',  false ],
    [ '1',  null,   '2',   null,  null, '3',   false ],
    [ '1',  null,   '1',   null,  null, '2',   false ],
    [ '0',  null,   '4',   null,  '5',  '9',   false ],
    [ '0',  '2',    '5',   null,  '3',  '11',  false ],
    // Max values testing.
    [ '1',  '1',    null,  'foo', null, '2',   false ],
    [ '1',  null,   null,  '10',  null, '2',   false ],
    [ '1',  null,   null,  '0',   null, '0',   false ],
    [ '1',  null,   null,  '-10', null, '0',   false ],
    [ '1',  null,   null,  '1',   null, '1',   false ],
    [ '-3', '5',    '-10', '-3',  null, '-5',  false ],
    // Step mismatch.
    [ '1',  '2',    '0',   null,  null, '4',   false ],
    [ '1',  '2',    '0',   null,  '2',  '6',   false ],
    [ '8',  '2',    null,  '9',   null, '8',   false ],
    [ '-3', '2',    '-6',  null,  null, '0',   false ],
    [ '9',  '3',    '-10', null,  null, '11',  false ],
    [ '7',  '3',    '-10', null,  null, '11',  false ],
    [ '7',  '3',    '5',   null,  null, '11',  false ],
    [ '9',  '4',    '3',   null,  null, '15',  false ],
    [ '-2', '3',    '-6',  null,  null, '0',   false ],
    [ '7',  '3',    '6',   null,  null, '9',   false ],
    // Clamping.
    [ '1',  '2',    '0',  '3',   null,  '2',   false ],
    [ '0',  '5',    '1',  '8',   '10',  '6',   false ],
    [ '-9', '3',    '-8', '-1',  '5',   '-2',  false ],
    [ '-9', '3',    '8',  '15',  '15',  '14',  false ],
    [ '-1', '3',    '-1', '4',   '3',   '2',   false ],
    [ '-3', '2',    '-6',  '-2',  null, '-2',  false ],
    [ '-3', '2',    '-6',  '-1',  null, '-2',  false ],
    // value = "" (default will be 50).
    [ '',   null,   null,  null,  null, '51',  false ],
    // With step = 'any'.
    [ '0',  'any',  null,  null,  1,    null,  true ],
    [ '0',  'ANY',  null,  null,  1,    null,  true ],
    [ '0',  'AnY',  null,  null,  1,    null,  true ],
    [ '0',  'aNy',  null,  null,  1,    null,  true ],
    // With @value = step base.
    [ '1',  '2',    null,  null,  null, '3',   false ],
  ]},
  { type: 'date', data: [
    // Regular case.
    [ '2012-07-09',  null,  null,  null,  null, '2012-07-10',   false ],
    // Argument testing.
    [ '2012-07-09',  null,  null,  null,  1,    '2012-07-10',   false ],
    [ '2012-07-09',  null,  null,  null,  9,    '2012-07-18',   false ],
    [ '2012-07-09',  null,  null,  null,  -1,   '2012-07-08',   false ],
    [ '2012-07-09',  null,  null,  null,  0,    '2012-07-09',   false ],
    // Month/Year wrapping.
    [ '2012-07-31',  null,  null,  null,  1,    '2012-08-01',   false ],
    [ '1968-12-29',  null,  null,  null,  4,    '1969-01-02',   false ],
    [ '1970-01-01',  null,  null,  null,  -365, '1969-01-01',   false ],
    [ '2012-03-01',  null,  null,  null,  -1,   '2012-02-29',   false ],
    // Float values are rounded to integer (1.1 -> 1).
    [ '2012-01-01',  null,  null,  null,  1.1,  '2012-01-02',   false ],
    [ '2012-01-01',  null,  null,  null,  1.9,  '2012-01-02',   false ],
    // With step values.
    [ '2012-01-01',  '0.5',  null,         null,  null, '2012-01-02',   false ],
    [ '2012-01-01',  '2',    null,         null,  null, '2012-01-03',   false ],
    [ '2012-01-01',  '0.25', null,         null,  4,    '2012-01-05',   false ],
    [ '2012-01-01',  '1.1',  '2012-01-01', null,  1,    '2012-01-02',   false ],
    [ '2012-01-01',  '1.1',  '2012-01-01', null,  2,    '2012-01-03',   false ],
    [ '2012-01-01',  '1.1',  '2012-01-01', null,  10,   '2012-01-11',   false ],
    [ '2012-01-01',  '1.1',  '2012-01-01', null,  11,   '2012-01-12',   false ],
    // step = 0 isn't allowed (-> step = 1).
    [ '2012-01-01',  '0',   null,  null,  null, '2012-01-02',   false ],
    // step < 0 isn't allowed (-> step = 1).
    [ '2012-01-01',  '-1',  null,  null,  null, '2012-01-02',   false ],
    // step = NaN isn't allowed (-> step = 1).
    [ '2012-01-01',  'foo', null,  null,  null, '2012-01-02',   false ],
    // Min values testing.
    [ '2012-01-01',  '1',   'foo',         null,  null,  '2012-01-02',  false ],
    [ '2012-01-01',  null,  '2011-12-01',  null,  null,  '2012-01-02',  false ],
    [ '2012-01-01',  null,  '2012-01-02',  null,  null,  '2012-01-02',  false ],
    [ '2012-01-01',  null,  '2012-01-01',  null,  null,  '2012-01-02',  false ],
    [ '2012-01-01',  null,  '2012-01-04',  null,  4,     '2012-01-05',  false ],
    [ '2012-01-01',  '2',   '2012-01-04',  null,  3,     '2012-01-06',  false ],
    // Max values testing.
    [ '2012-01-01',  '1',    null,  'foo',        2,     '2012-01-03',  false ],
    [ '2012-01-01',  '1',    null,  '2012-01-10', 1,     '2012-01-02',  false ],
    [ '2012-01-02',  null,   null,  '2012-01-01', null,  '2012-01-02',  false ],
    [ '2012-01-02',  null,   null,  '2012-01-02', null,  '2012-01-02',  false ],
    [ '1969-01-02',  '5',    '1969-01-01',  '1969-01-02', null,  '1969-01-02',  false ],
    // Step mismatch.
    [ '2012-01-02',  '2',    '2012-01-01',  null,         null,  '2012-01-03',  false ],
    [ '2012-01-02',  '2',    '2012-01-01',  null,         2,     '2012-01-05',  false ],
    [ '2012-01-05',  '2',    '2012-01-01',  '2012-01-06', null,  '2012-01-05',  false ],
    [ '1970-01-02',  '2',    null,          null,         null,  '1970-01-04',  false ],
    [ '1970-01-05',  '3',    null,          null,         null,  '1970-01-08',  false ],
    [ '1970-01-03',  '3',    null,          null,         null,  '1970-01-06',  false ],
    [ '1970-01-03',  '3',    '1970-01-02',  null,         null,  '1970-01-05',  false ],
    // Clamping.
    [ '2012-01-01',  null,   '2012-01-31',  null,         null,  '2012-01-31',  false ],
    [ '1970-01-02',  '2',    '1970-01-01',  '1970-01-04', null,  '1970-01-03',  false ],
    [ '1970-01-01',  '5',    '1970-01-02',  '1970-01-09', 10,    '1970-01-07',  false ],
    [ '1969-12-28',  '5',    '1969-12-29',  '1970-01-06', 3,     '1970-01-03',  false ],
    [ '1970-01-01',  '3',    '1970-02-01',  '1970-02-07', 15,    '1970-02-07',  false ],
    [ '1970-01-01',  '3',    '1970-01-01',  '1970-01-06', 2,     '1970-01-04',  false ],
    // value = "" (NaN).
    [ '',   null,   null,  null,  null, '1970-01-02',    false ],
    // With step = 'any'.
    [ '2012-01-01',  'any',  null,  null,  1,  null,  true ],
    [ '2012-01-01',  'ANY',  null,  null,  1,  null,  true ],
    [ '2012-01-01',  'AnY',  null,  null,  1,  null,  true ],
    [ '2012-01-01',  'aNy',  null,  null,  1,  null,  true ],
  ]},
  { type: 'time', data: [
    // Regular case.
    [ '16:39',  null,  null,  null,  null, '16:40',   false ],
    // Argument testing.
    [ '16:40',  null,  null,  null,  1,    '16:41',   false ],
    [ '16:40',  null,  null,  null,  5,    '16:45',   false ],
    [ '16:40',  null,  null,  null,  -1,   '16:39',   false ],
    [ '16:40',  null,  null,  null,  0,    '16:40',   false ],
    // hour/minutes/seconds wrapping.
    [ '04:59',  null,  null,  null, null,   '05:00',  false ],
    [ '04:59:59', 1,   null,  null, null,   '05:00',  false ],
    [ '04:59:59.900', 0.1,  null,  null, null, '05:00',  false ],
    [ '04:59:59.990', 0.01, null,  null, null, '05:00',  false ],
    [ '04:59:59.999', 0.001, null, null, null, '05:00',  false ],
    // stepUp() on '23:59' gives '00:00'.
    [ '23:59',  null,  null,  null,  1,    '00:00',   false ],
    [ '23:59',  null,  null,  null,  3,    '00:02',   false ],
    // Some random step values..
    [ '16:56',  '0.5', null,  null,  null, '16:56:00.500',   false ],
    [ '16:56',  '2',   null,  null,  null, '16:56:02',   false ],
    [ '16:56',  '0.25',null,  null,  4,    '16:56:01',   false ],
    [ '16:57',  '1.1',  '16:00', null,  1,    '16:57:01',   false ],
    [ '16:57',  '1.1',  '16:00', null,  2,    '16:57:02.100',   false ],
    [ '16:57',  '1.1',  '16:00', null,  10,   '16:57:10.900',   false ],
    [ '16:57',  '1.1',  '16:00', null,  11,   '16:57:12',   false ],
    [ '16:57',  '1.1',  '16:00', null,  8,    '16:57:08.700',   false ],
    // Invalid @step, means that we use the default value.
    [ '17:01',  '0',   null,  null,  null, '17:02',   false ],
    [ '17:01',  '-1',  null,  null,  null, '17:02',   false ],
    [ '17:01',  'foo', null,  null,  null, '17:02',   false ],
    // Min values testing.
    [ '17:02',  '60',    'foo',        null,  2, '17:04',  false ],
    [ '17:10',  '60',    '17:09', null,  null,   '17:11',  false ],
    [ '17:10',  '60',    '17:10', null,  null,   '17:11',  false ],
    [ '17:10',  '60',    '17:30', null,  1,      '17:30',  false ],
    [ '17:10',  '180',    '17:05', null,  null,  '17:11',  false ],
    [ '17:10',  '300',    '17:10', '17:11', null,'17:10',  false ],
    // Max values testing.
    [ '17:15',  '60',   null,  'foo',    null,  '17:16',  false ],
    [ '17:15',  null,   null,  '17:20',  null,  '17:16',  false ],
    [ '17:15',  null,   null,  '17:15',  null,  '17:15',  false ],
    [ '17:15',  null,   null,  '17:13',  4,     '17:15',  false ],
    [ '17:15',  '120',  null,  '17:13',  3,     '17:15',  false ],
    // Step mismatch.
    [ '17:19',  '120',  '17:10',  null,    null,  '17:20',  false ],
    [ '17:19',  '120',  '17:10',  null,    2,     '17:22',  false ],
    [ '17:19',  '120',  '17:18',  '17:25', null,  '17:20',  false ],
    [ '17:19',  '120',  null,     null,    null,  '17:21',  false ],
    [ '17:19',  '180',  null,     null,    null,  '17:22',  false ],
    // Clamping.
    [ '17:22',  null,   null,     '17:11', null,  '17:22',  false ],
    [ '17:22',  '120',  '17:20',  '17:22', null,  '17:22',  false ],
    [ '17:22',  '300',  '17:12',  '17:20', 10,    '17:22',  false ],
    [ '17:22',  '300',  '17:18',  '17:20', 2,     '17:22',  false ],
    [ '17:22',  '180',  '17:00',  '17:20', 15,    '17:22',  false ],
    [ '17:22',  '180',  '17:10',  '17:20', 2,     '17:22',  false ],
    // value = "" (NaN).
    [ '',   null,   null,  null,  null, '00:01',    false ],
    // With step = 'any'.
    [ '17:26',  'any',  null,  null,  1,  null,  true ],
    [ '17:26',  'ANY',  null,  null,  1,  null,  true ],
    [ '17:26',  'AnY',  null,  null,  1,  null,  true ],
    [ '17:26',  'aNy',  null,  null,  1,  null,  true ],
  ]},
  { type: 'month', data: [
    // Regular case.
    [ '2016-08',  null,  null,  null,  null, '2016-09',   false ],
    // Argument testing.
    [ '2016-08',  null,  null,  null,  1,    '2016-09',   false ],
    [ '2016-08',  null,  null,  null,  9,    '2017-05',   false ],
    [ '2016-08',  null,  null,  null,  -1,   '2016-07',   false ],
    [ '2016-08',  null,  null,  null,  0,    '2016-08',   false ],
    // Month/Year wrapping.
    [ '2015-12',  null,  null,  null,  1,    '2016-01',   false ],
    [ '1968-12',  null,  null,  null,  4,    '1969-04',   false ],
    [ '1970-01',  null,  null,  null,  -12,  '1969-01',   false ],
    // Float values are rounded to integer (1.1 -> 1).
    [ '2016-01',  null,  null,  null,  1.1,  '2016-02',   false ],
    [ '2016-01',  null,  null,  null,  1.9,  '2016-02',   false ],
    // With step values.
    [ '2016-01',  '0.5',  null,         null,  null, '2016-02',   false ],
    [ '2016-01',  '2',    null,         null,  null, '2016-03',   false ],
    [ '2016-01',  '0.25', null,         null,  4,    '2016-05',   false ],
    [ '2016-01',  '1.1',  '2016-01',    null,  1,    '2016-02',   false ],
    [ '2016-01',  '1.1',  '2016-01',    null,  2,    '2016-03',   false ],
    [ '2016-01',  '1.1',  '2016-01',    null,  10,   '2016-11',   false ],
    [ '2016-01',  '1.1',  '2016-01',    null,  11,   '2016-12',   false ],
    // step = 0 isn't allowed (-> step = 1).
    [ '2016-01',  '0',   null,  null,  null, '2016-02',   false ],
    // step < 0 isn't allowed (-> step = 1).
    [ '2016-01',  '-1',  null,  null,  null, '2016-02',   false ],
    // step = NaN isn't allowed (-> step = 1).
    [ '2016-01',  'foo', null,  null,  null, '2016-02',   false ],
    // Min values testing.
    [ '2016-01',  '1',   'foo',      null,  null,  '2016-02',  false ],
    [ '2016-01',  null,  '2015-12',  null,  null,  '2016-02',  false ],
    [ '2016-01',  null,  '2016-02',  null,  null,  '2016-02',  false ],
    [ '2016-01',  null,  '2016-01',  null,  null,  '2016-02',  false ],
    [ '2016-01',  null,  '2016-04',  null,  4,     '2016-05',  false ],
    [ '2016-01',  '2',   '2016-04',  null,  3,     '2016-06',  false ],
    // Max values testing.
    [ '2016-01',  '1',    null,       'foo',        2,     '2016-03',  false ],
    [ '2016-01',  '1',    null,       '2016-02',    1,     '2016-02',  false ],
    [ '2016-02',  null,   null,       '2016-01',    null,  '2016-02',  false ],
    [ '2016-02',  null,   null,       '2016-02',    null,  '2016-02',  false ],
    [ '1969-02',  '5',    '1969-01',  '1969-02',    null,  '1969-02',  false ],
    // Step mismatch.
    [ '2016-02',  '2',    '2016-01',  null,         null,  '2016-03',  false ],
    [ '2016-02',  '2',    '2016-01',  null,         2,     '2016-05',  false ],
    [ '2016-05',  '2',    '2016-01',  '2016-06',    null,  '2016-05',  false ],
    [ '1970-02',  '2',    null,       null,         null,  '1970-04',  false ],
    [ '1970-05',  '3',    null,       null,         null,  '1970-08',  false ],
    [ '1970-03',  '3',    null,       null,         null,  '1970-06',  false ],
    [ '1970-03',  '3',    '1970-02',  null,         null,  '1970-05',  false ],
    // Clamping.
    [ '2016-01',  null,   '2016-12',  null,         null,  '2016-12',  false ],
    [ '1970-02',  '2',    '1970-01',  '1970-04',    null,  '1970-03',  false ],
    [ '1970-01',  '5',    '1970-02',  '1970-09',    10,    '1970-07',  false ],
    [ '1969-11',  '5',    '1969-12',  '1970-06',    3,     '1970-05',  false ],
    [ '1970-01',  '3',    '1970-02',  '1971-07',    15,    '1971-05',  false ],
    [ '1970-01',  '3',    '1970-01',  '1970-06',    2,     '1970-04',  false ],
    // value = "" (NaN).
    [ '',   null,   null,  null,  null, '1970-02',    false ],
    // With step = 'any'.
    [ '2016-01',  'any',  null,  null,  1,  null,  true ],
    [ '2016-01',  'ANY',  null,  null,  1,  null,  true ],
    [ '2016-01',  'AnY',  null,  null,  1,  null,  true ],
    [ '2016-01',  'aNy',  null,  null,  1,  null,  true ],
  ]},
  { type: 'week', data: [
    // Regular case.
    [ '2016-W40',  null,  null,  null,  null, '2016-W41',   false ],
    // Argument testing.
    [ '2016-W40',  null,  null,  null,  1,    '2016-W41',   false ],
    [ '2016-W40',  null,  null,  null,  20,   '2017-W08',   false ],
    [ '2016-W40',  null,  null,  null,  -1,   '2016-W39',   false ],
    [ '2016-W40',  null,  null,  null,  0,    '2016-W40',   false ],
    // Week/Year wrapping.
    [ '2015-W53',  null,  null,  null,  1,    '2016-W01',   false ],
    [ '1968-W52',  null,  null,  null,  4,    '1969-W04',   false ],
    [ '1970-W01',  null,  null,  null,  -52,  '1969-W01',   false ],
    // Float values are rounded to integer (1.1 -> 1).
    [ '2016-W01',  null,  null,  null,  1.1,  '2016-W02',   false ],
    [ '2016-W01',  null,  null,  null,  1.9,  '2016-W02',   false ],
    // With step values.
    [ '2016-W01',  '0.5',  null,         null,  null, '2016-W02',   false ],
    [ '2016-W01',  '2',    null,         null,  null, '2016-W03',   false ],
    [ '2016-W01',  '0.25', null,         null,  4,    '2016-W05',   false ],
    [ '2016-W01',  '1.1',  '2016-01',    null,  1,    '2016-W02',   false ],
    [ '2016-W01',  '1.1',  '2016-01',    null,  2,    '2016-W03',   false ],
    [ '2016-W01',  '1.1',  '2016-01',    null,  10,   '2016-W11',   false ],
    [ '2016-W01',  '1.1',  '2016-01',    null,  20,   '2016-W21',   false ],
    // step = 0 isn't allowed (-> step = 1).
    [ '2016-W01',  '0',   null,  null,  null, '2016-W02',   false ],
    // step < 0 isn't allowed (-> step = 1).
    [ '2016-W01',  '-1',  null,  null,  null, '2016-W02',   false ],
    // step = NaN isn't allowed (-> step = 1).
    [ '2016-W01',  'foo', null,  null,  null, '2016-W02',   false ],
    // Min values testing.
    [ '2016-W01',  '1',   'foo',       null,  null,  '2016-W02',  false ],
    [ '2016-W01',  null,  '2015-W53',  null,  null,  '2016-W02',  false ],
    [ '2016-W01',  null,  '2016-W02',  null,  null,  '2016-W02',  false ],
    [ '2016-W01',  null,  '2016-W01',  null,  null,  '2016-W02',  false ],
    [ '2016-W01',  null,  '2016-W04',  null,  4,     '2016-W05',  false ],
    [ '2016-W01',  '2',   '2016-W04',  null,  3,     '2016-W06',  false ],
    // Max values testing.
    [ '2016-W01',  '1',    null,       'foo',         2,     '2016-W03',  false ],
    [ '2016-W01',  '1',    null,       '2016-W02',    1,     '2016-W02',  false ],
    [ '2016-W02',  null,   null,       '2016-W01',    null,  '2016-W02',  false ],
    [ '2016-W02',  null,   null,       '2016-W02',    null,  '2016-W02',  false ],
    [ '1969-W02',  '5',    '1969-W01', '1969-W02',    null,  '1969-W02',  false ],
    // Step mismatch.
    [ '2016-W02',  '2',    '2016-W01',  null,          null,  '2016-W03',  false ],
    [ '2016-W02',  '2',    '2016-W01',  null,          2,     '2016-W05',  false ],
    [ '2016-W05',  '2',    '2016-W01',  '2016-W06',    null,  '2016-W05',  false ],
    [ '1970-W02',  '2',    null,        null,          null,  '1970-W04',  false ],
    [ '1970-W05',  '3',    null,        null,          null,  '1970-W08',  false ],
    [ '1970-W03',  '3',    null,        null,          null,  '1970-W06',  false ],
    [ '1970-W03',  '3',    '1970-W02',  null,          null,  '1970-W05',  false ],
    // Clamping.
    [ '2016-W01',  null,   '2016-W52',  null,          null,  '2016-W52',  false ],
    [ '1970-W02',  '2',    '1970-W01',  '1970-W04',    null,  '1970-W03',  false ],
    [ '1970-W01',  '5',    '1970-W02',  '1970-W09',    10,    '1970-W07',  false ],
    [ '1969-W50',  '5',    '1969-W52',  '1970-W06',    3,     '1970-W05',  false ],
    [ '1970-W01',  '3',    '1970-W02',  '1971-W07',    15,    '1970-W44',  false ],
    [ '1970-W01',  '3',    '1970-W01',  '1970-W06',    2,     '1970-W04',  false ],
    // value = "" (NaN).
    [ '',   null,   null,  null,  null, '1970-W02',    false ],
    // With step = 'any'.
    [ '2016-W01',  'any',  null,  null,  1,  null,  true ],
    [ '2016-W01',  'ANY',  null,  null,  1,  null,  true ],
    [ '2016-W01',  'AnY',  null,  null,  1,  null,  true ],
    [ '2016-W01',  'aNy',  null,  null,  1,  null,  true ],
  ]},
  { type: 'datetime-local', data: [
    // Regular case.
    [ '2017-02-07T17:09',  null,  null,  null,  null, '2017-02-07T17:10',   false ],
    // Argument testing.
    [ '2017-02-07T17:10',  null,  null,  null,  1,    '2017-02-07T17:11',   false ],
    [ '2017-02-07T17:10',  null,  null,  null,  5,    '2017-02-07T17:15',   false ],
    [ '2017-02-07T17:10',  null,  null,  null,  -1,   '2017-02-07T17:09',   false ],
    [ '2017-02-07T17:10',  null,  null,  null,  0,    '2017-02-07T17:10',   false ],
    // hour/minutes/seconds wrapping.
    [ '2000-01-01T04:59',        null,  null,  null, null, '2000-01-01T05:00',  false ],
    [ '2000-01-01T04:59:59',     1,     null,  null, null, '2000-01-01T05:00',  false ],
    [ '2000-01-01T04:59:59.900', 0.1,   null,  null, null, '2000-01-01T05:00',  false ],
    [ '2000-01-01T04:59:59.990', 0.01,  null,  null, null, '2000-01-01T05:00',  false ],
    [ '2000-01-01T04:59:59.999', 0.001, null,  null, null, '2000-01-01T05:00',  false ],
    // month/year wrapping.
    [ '2012-07-31T12:00',  null,  null,  null,  1440,  '2012-08-01T12:00',   false ],
    [ '1968-12-29T12:00',  null,  null,  null,  5760,  '1969-01-02T12:00',   false ],
    [ '1970-01-01T00:00',  null,  null,  null,  -1440, '1969-12-31T00:00',   false ],
    [ '2012-03-01T00:00',  null,  null,  null,  -1440, '2012-02-29T00:00',   false ],
    // stepUp() on '23:59' gives '00:00'.
    [ '2017-02-07T23:59',  null,  null,  null,  1,    '2017-02-08T00:00',   false ],
    [ '2017-02-07T23:59',  null,  null,  null,  3,    '2017-02-08T00:02',   false ],
    // Some random step values..
    [ '2017-02-07T17:40',  '0.5',    null,               null,  null, '2017-02-07T17:40:00.500', false ],
    [ '2017-02-07T17:40',  '2',      null,               null,  null, '2017-02-07T17:40:02',     false ],
    [ '2017-02-07T17:40',  '0.25',   null,               null,  4,    '2017-02-07T17:40:01',     false ],
    [ '2017-02-07T17:40',  '1.1',    '2017-02-07T17:00', null,  1,    '2017-02-07T17:40:00.200', false ],
    [ '2017-02-07T17:40',  '1.1',    '2017-02-07T17:00', null,  2,    '2017-02-07T17:40:01.300', false ],
    [ '2017-02-07T17:40',  '1.1',    '2017-02-07T17:00', null,  10,   '2017-02-07T17:40:10.100', false ],
    [ '2017-02-07T17:40',  '129600', '2017-02-01T00:00', null,  2,    '2017-02-10T00:00',        false ],
    // step = 0 isn't allowed (-> step = 1).
    [ '2017-02-07T17:39',  '0',   null,  null,  null, '2017-02-07T17:40',   false ],
    // step < 0 isn't allowed (-> step = 1).
    [ '2017-02-07T17:39',  '-1',  null,  null,  null, '2017-02-07T17:40',   false ],
    // step = NaN isn't allowed (-> step = 1).
    [ '2017-02-07T17:39',  'foo', null,  null,  null, '2017-02-07T17:40',   false ],
    // Min values testing.
    [ '2012-02-02T17:00',  '60',     'foo',              null,  2,     '2012-02-02T17:02',  false ],
    [ '2012-02-02T17:10',  '60',     '2012-02-02T17:10', null,  null,  '2012-02-02T17:11',  false ],
    [ '2012-02-02T17:10',  '60',     '2012-02-02T17:30', null,  1,     '2012-02-02T17:30',  false ],
    [ '2012-02-02T17:10',  '180',    '2012-02-02T17:05', null,  null,  '2012-02-02T17:11',  false ],
    [ '2012-02-02T17:10',  '86400',  '2012-02-02T17:05', null,  null,  '2012-02-03T17:05',  false ],
    [ '2012-02-02T17:10',  '129600', '2012-02-01T00:00', null,  null,  '2012-02-04T00:00',  false ],
    // Max values testing.
    [ '2012-02-02T17:15',  '60',     null,  'foo',               null,  '2012-02-02T17:16',  false ],
    [ '2012-02-02T17:15',  null,     null,  '2012-02-02T17:20',  null,  '2012-02-02T17:16',  false ],
    [ '2012-02-02T17:15',  null,     null,  '2012-02-02T17:15',  null,  '2012-02-02T17:15',  false ],
    [ '2012-02-02T17:15',  null,     null,  '2012-02-02T17:13',  4,     '2012-02-02T17:15',  false ],
    [ '2012-02-02T20:05',  '86400',  null,  '2012-02-03T20:05',  null,  '2012-02-03T20:05',  false ],
    [ '2012-02-02T18:00',  '129600', null,  '2012-02-04T20:00',  null,  '2012-02-04T06:00',  false ],
    // Step mismatch.
    [ '2017-02-07T17:19',  '120',  '2017-02-07T17:10',   null,               null,  '2017-02-07T17:20',  false ],
    [ '2017-02-07T17:19',  '120',  '2017-02-07T17:10',   null,               2,     '2017-02-07T17:22',  false ],
    [ '2017-02-07T17:19',  '120',  '2017-02-07T17:18',   '2017-02-07T17:25', null,  '2017-02-07T17:20',  false ],
    [ '2017-02-07T17:19',  '120',  null,                 null,               null,  '2017-02-07T17:21',  false ],
    [ '2017-02-07T17:19',  '180',  null,                 null,               null,  '2017-02-07T17:22',  false ],
    [ '2017-02-03T17:19',  '172800', '2017-02-02T17:19', '2017-02-10T17:19', null,  '2017-02-04T17:19',  false ],
    // Clamping.
    [ '2017-02-07T17:22',  null,   null,                '2017-02-07T17:11', null,  '2017-02-07T17:22',  false ],
    [ '2017-02-07T17:22',  '120',  '2017-02-07T17:20',  '2017-02-07T17:22', null,  '2017-02-07T17:22',  false ],
    [ '2017-02-07T17:22',  '300',  '2017-02-07T17:12',  '2017-02-07T17:20', 10,    '2017-02-07T17:22',  false ],
    [ '2017-02-07T17:22',  '300',  '2017-02-07T17:18',  '2017-02-07T17:20', 2,     '2017-02-07T17:22',  false ],
    [ '2017-02-06T17:22',  '600',  '2017-02-02T17:00',  '2017-02-07T17:20', 15,    '2017-02-06T19:50',  false ],
    [ '2017-02-06T17:22',  '600',  '2017-02-02T17:10',  '2017-02-07T17:20', 2,     '2017-02-06T17:40',  false ],
    // value = "" (NaN).
    [ '',   null,   null,  null,  null, '1970-01-01T00:01',    false ],
    // With step = 'any'.
    [ '2017-02-07T17:30',  'any',  null,  null,  1,  null,  true ],
    [ '2017-02-07T17:30',  'ANY',  null,  null,  1,  null,  true ],
    [ '2017-02-07T17:30',  'AnY',  null,  null,  1,  null,  true ],
    [ '2017-02-07T17:30',  'aNy',  null,  null,  1,  null,  true ],
  ]},
  ];

  for (var test of testData) {
    for (var data of test.data) {
      var element = document.createElement("input");
      element.type = test.type;

      if (data[1] != null) {
        element.step = data[1];
      }

      if (data[2] != null) {
        element.min = data[2];
      }

      if (data[3] != null) {
        element.max = data[3];
      }

      // Set 'value' last for type=range, because the final sanitized value
      // after setting 'step', 'min' and 'max' can be affected by the order in
      // which those attributes are set. Setting 'value' last makes it simpler
      // to reason about what the final value should be.
      if (data[0] != null) {
        element.setAttribute('value', data[0]);
      }

      var exceptionCaught = false;
      try {
        if (data[4] != null) {
          element.stepUp(data[4]);
        } else {
          element.stepUp();
        }

        is(element.value, data[5], "The value for type=" + test.type + " should be " + data[5]);
      } catch (e) {
        exceptionCaught = true;
        is(element.value, data[0], e.name + "The value should not have changed");
        is(e.name, 'InvalidStateError',
           "It should be a InvalidStateError exception.");
      } finally {
        is(exceptionCaught, data[6], "exception status should be " + data[6]);
      }
    }
  }
}

checkPresence();
checkAvailability();

checkStepDown();
checkStepUp();

</script>
</pre>
</body>
</html>
